package pers.sloera.leetcode.editor.cn;

import java.util.ArrayList;
import java.util.List;

/**
 * 自除数 是指可以被它包含的每一位数整除的数。
 * <p>
 * <p>
 * 例如，128 是一个 自除数 ，因为 128 % 1 == 0，128 % 2 == 0，128 % 8 == 0。
 * <p>
 * <p>
 * 自除数 不允许包含 0 。
 * <p>
 * 给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * <p>
 * 输入：left = 1, right = 22
 * 输出：[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
 * <p>
 * <p>
 * 示例 2:
 * <p>
 * <p>
 * 输入：left = 47, right = 85
 * 输出：[48,55,66,77]
 * <p>
 * <p>
 * <p>
 * <p>
 * 提示：
 * <p>
 * <p>
 * 1 <= left <= right <= 10⁴
 * <p>
 * Related Topics 数学 👍 219 👎 0
 */

//leetcode submit region begin(Prohibit modification and deletion)
// class Solution {
class Solution728 {
    //   public static void main(String[] args) {
    //     Solution728 solution728 = new Solution728();
    //     System.out.println(solution728.selfDividingNumbers(1, 22));
    //     System.out.println(solution728.selfDividingNumbers(47, 85));
    //   }
    public List<Integer> selfDividingNumbers(int left, int right) {
        ArrayList<Integer> result = new ArrayList<>();
        for (int i = left; i <= right; i++) {
            if (isSelfDivided(i)) {
                result.add(i);
            }
        }
        return result;
    }

    /**
     * 判断一个数是否是自除数
     *
     * @return boolean
     * @date 2022/3/31
     */
    private boolean isSelfDivided(int i) {
        return String.valueOf(i).chars().map(x -> x - '0').noneMatch(x -> x == 0 || i % x != 0);
    }
}
//leetcode submit region end(Prohibit modification and deletion)
